import { BrowserWindow, ipcMain } from 'electron';
import { WebSocketClient } from './ws_client';
import ProtoMessageHandler from '../proto/ProtoMessageHandler';
import log from 'electron-log/main';

// 创建WebSocket客户端实例
const ws_message = new WebSocketClient('ws://localhost:8000/ws/message');

export const setupWebSocketIPC = (win: BrowserWindow | null) => {
  // 连接到 WebSocket 服务器
  ws_message.connect();

  // 添加一个获取连接状态的方法
  const isConnected = () => {
    try {
      // 应该在WebSocketClient类中添加isConnected方法，而不是直接访问ws属性
      return ws_message && ws_message.isConnected();
    } catch (err) {
      log.error('检查连接状态时出错:', err);
      return false;
    }
  };

  // 处理发送消息到 WebSocket
  ipcMain.handle('ipc-message', async (event, message) => {
    if (!isConnected()) {
      return 'WebSocket 连接未打开';
    }

    // 验证消息格式（必须是字符串或 Buffer）
    if (
      !message ||
      (typeof message !== 'string' && !Buffer.isBuffer(message))
    ) {
      return '无效的消息格式';
    }

    try {
      ws_message.sendRequest(message); // 传递从渲染进程接收到的消息
      return `消息已发送: ${message}`;
    } catch (err) {
      log.error('发送消息到 WebSocket 时出错:', err);
      return '发送消息失败';
    }
  });

  // 处理获取 WebSocket 状态
  ipcMain.handle('ipc_message-status', () => {
    if (!ws_message) return 'WebSocket 客户端未初始化';
    return isConnected() ? 'WebSocket 客户端已连接' : 'WebSocket 客户端未连接';
  });

  ws_message.setOnBinaryMessageCallback((binaryData: Buffer) => {
    if (binaryData instanceof Buffer) {
      try {
        const response = ProtoMessageHandler.decodeResponse(binaryData);
        const data =
          response.dataType === 'json'
            ? JSON.parse(response.data.toString())
            : response.data.toString();

        log.info('收到响应:', data);

        // 安全地发送消息到渲染进程
        if (win && !win.isDestroyed()) {
          try {
            win.webContents.send('ipc-message-receive', data);
          } catch (sendError) {
            log.error('发送消息到渲染进程时出错:', sendError);
          }
        }
      } catch (error) {
        log.error('解码响应时出错:', error);
      }
    }
  });

  // 监听 WebSocket 错误
  ws_message.setOnErrorCallback((error: Error) => {
    log.error('WebSocket 错误:', error);
  });

  // 返回清理函数，以便外部调用
  return () => {
    try {
      ws_message.disconnect(true);
      log.info('WebSocket 连接已关闭');
    } catch (err) {
      log.error('关闭 WebSocket 连接时出错:', err);
    }
  };
};
